home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 12 / CU Amiga Magazine's Super CD-ROM 12 (1997)(EMAP Images)(GB)[!][issue 1997-07].iso / CUCD / Graphics / Gallery / Gallery.cpp < prev    next >
C/C++ Source or Header  |  1997-04-16  |  18KB  |  598 lines

  1. #define __VERSION__     "39"
  2. #define __REVISION__     "3"
  3. #define __NAME__            "Gallery"
  4. #define __AUTHOR__        "Markus Hillenbrand"
  5.  
  6. char *V = "$VER: " __NAME__ " " __VERSION__ "." __REVISION__ " (" __DATE__ ")";
  7.  
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11.  
  12. #include <GUIC_Classes/GUIC_System.hpp>
  13. #include <GUIC_Classes/GUIC_Date.hpp>
  14. #include <GUIC_Classes/GUIC_Error.hpp>
  15. #include <GUIC_Classes/GUIC_Frame.hpp>
  16. #include <GUIC_Classes/GUIC_Application.hpp>
  17. #include <GUIC_Classes/GUIC_Screen.hpp>
  18. #include <GUIC_Classes/GUIC_Window.hpp>
  19. #include <GUIC_Classes/GUIC_Error.hpp>
  20. #include <GUIC_Classes/GUIC_Exceptions.hpp>
  21. #include <GUIC_Classes/GUIC_DirectoryExamine.hpp>
  22. #include <GUIC_Classes/GUIC_FileExamine.hpp>
  23. #include <GUIC_Classes/GUIC_File.hpp>
  24. #include <GUIC_Classes/GUIC_Key.hpp>
  25. #include <GUIC_Classes/GUIC_List.hpp>
  26. #include <GUIC_Classes/GUIC_Node.hpp>
  27. #include <GUIC_Classes/GUIC_Exceptions.hpp>
  28. #include <GUIC_Classes/GUIC_Button.hpp>
  29. #include <GUIC_Classes/GUIC_Checkbox.hpp>
  30. #include <GUIC_Classes/GUIC_String.hpp>
  31. #include <GUIC_Classes/GUIC_Integer.hpp>
  32. #include <GUIC_Classes/GUIC_Slider.hpp>
  33. #include <GUIC_Classes/GUIC_Label.hpp>
  34. #include <GUIC_Classes/GUIC_SlidingInteger.hpp>
  35. #include <GUIC_Classes/GUIC_FileString.hpp>
  36. #include <GUIC_Classes/GUIC_PathString.hpp>
  37. #include <GUIC_Classes/GUIC_Message.hpp>
  38. #include <GUIC_Classes/GUIC_FileRequester.hpp>
  39. #include <GUIC_Classes/GUIC_ProgramArgs.hpp>
  40.  
  41. #define COPYRIGHT    "<SMALL> index file created with 'Gallery', (c) 1997 by <A HREF=\"http://www.student.uni-kl.de/~hillenbr\">Markus Hillenbrand</A> </SMALL>"
  42. #define FILEFILTER     "#?.(jpeg|jpg|gif|iff|ilbm|iff24|png|bmp|pcx|tiff)"
  43.  
  44. #define MINLINES                    3
  45. #define MINCOLUMNS            3    
  46. #define MAXLINES                    200
  47. #define MAXCOLUMNS            200    
  48. #define DEFAULTLINES            3
  49. #define DEFAULTCOLUMNS    5
  50.  
  51. GUIC_ListC errorList;
  52. int lastDay=0,lastMonth=0,lastYear=0;
  53.  
  54.  
  55. class GalleryEntryC : public GUIC_ObjectC
  56.     {
  57.     public:
  58.         GalleryEntryC        (STRPTR f, LONG s, int d, int m, int y)     { fileName=f; size=s; day=d; month=m; year=y; }
  59.         int         compare    (GUIC_ObjectC &o);
  60.         void    print        (void) { cout << fileName << endl; }
  61.         String fileName;
  62.         int day,month,year;
  63.         LONG size;
  64.     protected:
  65.         void cleanUp(void) {};
  66.     };
  67.     
  68. int GalleryEntryC::compare(GUIC_ObjectC &o)
  69.     // First we must convert the argument to what it really is:
  70.     GalleryEntryC *g = (GalleryEntryC *)&o; 
  71.     
  72.     return strcmp(this->fileName, g->fileName); // Just compare the two file names    
  73. }
  74.  
  75. String     makeThumbnail    (GUIC_FileExamineC &file)
  76. {
  77.     String fileName = file.getName();
  78.  
  79.     int i = fileName.length();
  80.     while (--i) if (fileName[i] == '.') break;
  81.  
  82.     String thumbName = fileName.left(i);
  83.     thumbName+="_.jpg";
  84.  
  85.     try
  86.         {
  87.         GUIC_FileExamineC f(thumbName);
  88.         if (f.newer(file)) return thumbName;
  89.         }
  90.     catch (GUIC_SystemX &e) { }
  91.  
  92.     String args = "<>NIL: \"" + fileName + "\" TO \"" + thumbName + "\" FORMAT JPEG QUALITY 90 BOXFIT 100 100";
  93.  
  94.     cout << " - creating thumbnail for file '" << fileName << "' ... " << flush;
  95.     BOOL result = GUIC_SystemC::runProgram("GfxCon_68020", 100000, args);
  96.     if (result) cout << "done." << endl; else cout << "error occured." << endl;
  97.  
  98.     return thumbName;
  99. }
  100. void         createGallery        (GUIC_ListC &fileList, STRPTR pattern, LONG linesInTable, LONG columnsInTable, BOOL picClick)
  101. {
  102.     GalleryEntryC *key = (GalleryEntryC *)fileList.objectAt(1);
  103.     GUIC_FileExamineC firstFile(key->fileName);
  104.     String currentDir = firstFile.getPathPart();
  105.     
  106.     ldiv_t d = ldiv ( fileList.length(), columnsInTable );
  107.     int lines = d.quot;
  108.     if (d.rem) lines++;
  109.     
  110.     d = ldiv (lines, linesInTable);
  111.     int galleries = d.quot;
  112.     if (d.rem) galleries++;
  113.  
  114.     cout << "Creating " << galleries << " galleries in directory '" << currentDir << "' " << endl;
  115.     
  116.     fileList.sort();
  117.     
  118.     GUIC_FileExamineC directoryName(currentDir);
  119.  
  120.     // Create the index file with the frames
  121.     
  122.     GUIC_FileC gallery(currentDir, "index.html", GUIC_Write);
  123.     gallery.write("<TITLE>Gallery '");
  124.     gallery.write(directoryName.getFilePart());
  125.     gallery.writeLn("'</TITLE>");
  126.     gallery.writeLn("<FRAMESET COLS=150,*>");
  127.     gallery.writeLn("<FRAME NAME=F1 SRC=\"galleries.html\" MarginHeight=0 MarginWidth=0 Scrolling=\"auto\" FrameBorder=0>");
  128.     gallery.writeLn("<FRAME NAME=F2 SRC=\"index1.html\" MarginHeight=0 MarginWidth=0 Scrolling=\"auto\" FrameBorder=0>");
  129.     gallery.writeLn("</FRAMESET>");
  130.     
  131.     // now create the overview over the galleries
  132.     GUIC_FileC overview (currentDir, "galleries.html", GUIC_Write);
  133.     overview.writeLn("<HTML>");
  134.     overview.write("<H2>"); 
  135.     overview.write(directoryName.getFilePart());
  136.     overview.writeLn("</H2><BR>");
  137.     for (int i=1; i<=galleries; i++)
  138.         {
  139.         overview.write("<A HREF=\"index");
  140.         overview.write(i);
  141.         overview.write(".html\" TARGET=F2>Gallery ");
  142.         overview.write(i);
  143.         overview.writeLn("</A> <BR>");
  144.         }
  145.         
  146.     overview.writeLn("<BR> <BR> <IMG SRC=internal-gopher-menu> <A HREF=\"../index.html\" TARGET=_top> up </A>");
  147.     overview.writeLn("</HTML>");
  148.  
  149.     // create each gallery
  150.     int count = 0;
  151.     for (i=1; i<=galleries; i++)
  152.         {
  153.         char filename[256];
  154.         sprintf(filename, "index%ld.html", i);
  155.         GUIC_FileC indexFile(currentDir, filename, GUIC_Write);
  156.  
  157.         // write head and title    
  158.         indexFile.writeLn("<HTML>");
  159.         indexFile.writeLn("<HEAD>");
  160.     
  161.         indexFile.write("<TITLE> "); indexFile.write(directoryName.getFilePart());    indexFile.writeLn(" </TITLE>");
  162.         indexFile.writeLn("</HEAD>");
  163.         indexFile.write("<BODY");
  164.         if (pattern)
  165.             {
  166.             indexFile.write(" Background=\"");
  167.             indexFile.write(pattern);
  168.             indexFile.write("\"");
  169.             }
  170.         indexFile.writeLn(">");
  171.         
  172.         indexFile.write("<CENTER><H2>"); 
  173.         indexFile.write(directoryName.getFilePart()); 
  174.         indexFile.write("</H2> (Part ");
  175.         indexFile.write(i);
  176.         indexFile.write(" of ");
  177.         indexFile.write(galleries);
  178.         indexFile.writeLn(")<BR>");
  179.  
  180.         indexFile.writeLn("<HR>");
  181.         indexFile.writeLn("<TABLE Border=1 CellSpacing=4 CellPadding=4>");
  182.         
  183.         int boundary = count + columnsInTable*linesInTable;
  184.         if (boundary>fileList.length()) boundary = fileList.length();
  185.         
  186.         for (int j=count; j<boundary; j++)
  187.             {
  188.             key = (GalleryEntryC *)fileList.objectAt(j+1);
  189.             GUIC_FileExamineC file(key->fileName);
  190.             String thumbName = "";
  191.             
  192.             // Create the thumbnail now            
  193.             try
  194.                 {
  195.                 thumbName = makeThumbnail(file);
  196.                 GUIC_FileExamineC thumb (thumbName);
  197.                 thumbName = thumb.getFilePart();
  198.                 }
  199.             catch (GUIC_SystemX &e) { GalleryEntryC *s = new GalleryEntryC(key->fileName,0,0,0,0); errorList.addTail(*s); }
  200.  
  201.             // Check the date
  202.             GUIC_DateC oldDate(lastDay,lastMonth,lastYear),*fileDate = file.getDate();;
  203.             if (fileDate->greater(oldDate) )
  204.                 {
  205.                 lastDay   = fileDate->getDay();
  206.                 lastMonth = fileDate->getMonth();
  207.                 lastYear  = fileDate->getYear();
  208.                 }
  209.  
  210.             // Check if there are 5 entries per line in the table
  211.             if (count++ % columnsInTable == 0) indexFile.write("<TR> ");
  212.  
  213.             // write the picture data
  214.             indexFile.write("<TD> <CENTER>");
  215.             
  216.             if (picClick)
  217.                 {
  218.                 indexFile.write("<A HREF=\"");
  219.                 indexFile.write(file.getFilePart());
  220.                 indexFile.write("\"> <IMG SRC=\"");
  221.                 indexFile.write(thumbName);
  222.                 indexFile.write("\" ALT=Thumbnail> <BR>");
  223.                 }
  224.             else
  225.                 {
  226.                 indexFile.write("<IMG SRC=\"");
  227.                 indexFile.write(thumbName);
  228.                 indexFile.write("\" ALT=Thumbnail> <BR>");
  229.                 indexFile.write("<A HREF=\"");
  230.                 indexFile.write(file.getFilePart());
  231.                 indexFile.write("\">");
  232.                 }
  233.                 
  234.             indexFile.write(file.getFilePart());
  235.             indexFile.write(" </A> <BR> Size: ");
  236.             indexFile.write(key->size);
  237.             indexFile.write(" <BR> Date: ");
  238.             indexFile.write(key->day);
  239.             indexFile.write(".");
  240.             indexFile.write(key->month);
  241.             indexFile.write(".");
  242.             indexFile.write(key->year);
  243.             indexFile.writeLn("</TD>");
  244.             }
  245.             
  246.         indexFile.writeLn("</TABLE>");
  247.  
  248.         indexFile.writeLn("<HR>");
  249.         indexFile.writeLn(COPYRIGHT);
  250.         indexFile.writeLn("</BODY>");
  251.         indexFile.writeLn("</HTML>");
  252.         }
  253. }
  254. void         createHTML        (GUIC_ListC &fileList, STRPTR pattern)
  255. {
  256.     GalleryEntryC *key = (GalleryEntryC *)fileList.objectAt(1);
  257.     GUIC_FileExamineC firstFile(key->fileName);
  258.  
  259.     STRPTR currentDir = firstFile.getPathPart();
  260.     GUIC_FileC indexFile(currentDir, "index.html", GUIC_Write);
  261.     GUIC_FileExamineC directoryName(currentDir);
  262.  
  263.     String titleString = directoryName.getFilePart();
  264.     if (titleString == String("") ) titleString = directoryName.getName();
  265.  
  266.     cout << "Creating file '" << indexFile.getName() << "'" << endl;
  267.  
  268.     indexFile.writeLn("<HTML>");
  269.     indexFile.writeLn("<HEAD>");
  270.     indexFile.write("<TITLE> "); indexFile.write(titleString); indexFile.writeLn(" </TITLE>");
  271.     indexFile.writeLn("</HEAD>");
  272.     indexFile.write("<BODY");
  273.     if (pattern)
  274.         {
  275.         indexFile.write(" Background=\"");
  276.         indexFile.write(pattern);
  277.         indexFile.write("\"");
  278.         }
  279.     indexFile.writeLn(">");
  280.     indexFile.write("<CENTER><H1>"); indexFile.write(titleString); indexFile.writeLn("</H1>");
  281.     indexFile.writeLn("<HR><BR><BR>");
  282.     
  283.     // Create the table of galleries
  284.     
  285.     indexFile.writeLn("<TABLE Border=1 CellSpacing=4 CellPadding=4>");
  286.     indexFile.writeLn("<TR> <TH> <CENTER> <H3> Gallery Name </H3> </TH> <TH> <CENTER> <H3> Entries </H3> </TH> <TH> <CENTER> <H3> Last Update </H3> </TH>");
  287.     
  288.     fileList.sort();
  289.     
  290.     for (int i=1; i<=fileList.length(); i++)
  291.         {
  292.         key = (GalleryEntryC *)fileList.objectAt(i);
  293.         GUIC_FileExamineC file (key->fileName);
  294.  
  295.         indexFile.write("<TR> <TD> <CENTER> <A HREF=\"");
  296.         indexFile.write(file.getFilePart());
  297.         indexFile.write("/index.html\"");
  298.         indexFile.write("> ");
  299.         indexFile.write(file.getFilePart());
  300.         indexFile.write(" </A> </TD> <TD> <CENTER> ");
  301.         indexFile.write(key->size);
  302.         indexFile.write(" </TD> <TD> <CENTER> ");
  303.  
  304.         if (key->day)
  305.             {
  306.             indexFile.write(key->day);
  307.             indexFile.write(".");
  308.             indexFile.write(key->month);
  309.             indexFile.write(".");
  310.             indexFile.write(key->year);
  311.             }
  312.         else indexFile.write("(Directory)");
  313.         indexFile.writeLn(" </TD>");
  314.         }
  315.  
  316.     indexFile.writeLn("</TABLE>");
  317.  
  318.     indexFile.writeLn("<BR> <IMG SRC=internal-gopher-menu> <A HREF=\"../index.html\" TARGET=_top> up </A> <BR>");
  319.  
  320.     indexFile.writeLn("<HR>");
  321.     indexFile.writeLn(COPYRIGHT);
  322.     indexFile.writeLn("</BODY>");
  323.     indexFile.writeLn("</HTML>");
  324. }
  325. int             scanDir                (STRPTR startDir, STRPTR pattern, LONG linesInTable, LONG columnsInTable, BOOL picClick)
  326. {
  327.     GUIC_ListC fileList,dirList;
  328.     GalleryEntryC *key = 0;
  329.     GUIC_FileExamineC *filex = 0;
  330.     int entries = 0;
  331.  
  332.     GUIC_FileExamineC *examine = new GUIC_FileExamineC(startDir);
  333.     if (!examine->isDirectory()) throw GUIC_SystemX("Error in function ScanDir (directory name expected).");
  334.     String dirName = examine->getName();
  335.     delete examine; examine=0;
  336.  
  337.     GUIC_DirectoryExamineC *direx= new GUIC_DirectoryExamineC(dirName);
  338.     BOOL hasSubDirs = direx->hasSubdirectory();
  339.     if (!hasSubDirs) direx->setFilter(FILEFILTER);
  340.  
  341.     try
  342.         {
  343.         while ( (filex = direx->examineNext()) )
  344.             {
  345.             String fileName  = filex->getName();
  346.             GUIC_DateC *date = filex->getDate();
  347.  
  348.             if (filex->isDirectory())
  349.                 {
  350.                 String newPattern = String("../") + String(pattern);
  351.                 int entriesInDir  = scanDir(fileName, pattern ? (STRPTR) newPattern : 0, linesInTable, columnsInTable, picClick);
  352.                 if (entriesInDir)
  353.                     {
  354.                     key = new GalleryEntryC(fileName, entriesInDir, lastDay, lastMonth, lastYear);
  355.                     if (!key) throw GUIC_MemoryX("Can't allocate memory for key.");
  356.                     dirList.addTail(*key);
  357.                     entries+=entriesInDir;
  358.                     }
  359.                 lastDay=0; lastMonth=0; lastYear=0;
  360.                 }
  361.             else if (! hasSubDirs && (fileName.right(5) != String("_.jpg") ) )
  362.                 {
  363.                 key = new GalleryEntryC(fileName, filex->getSize(), date->getDay(), date->getMonth(), date->getYear() );
  364.                 if (!key) throw GUIC_MemoryX("Can't allocate memory for key.");
  365.                 fileList.addTail(*key);
  366.                 entries++;
  367.                 }
  368.             }
  369.         }
  370.     catch (GUIC_SystemX &e) { cerr << "Exception caught while processing directory '" << direx->getName() << "': " << e.getMessage() << endl; }
  371.     delete direx;direx=0; /* Damit der lock auf das Verzeichnis freigegeben wird ! */
  372.  
  373.     if (dirList.length())     createHTML        (dirList,pattern);
  374.     if (fileList.length())    createGallery        (fileList,pattern, linesInTable, columnsInTable, picClick);
  375.  
  376.     while (fileList.length()) delete (GalleryEntryC *)fileList.remove(1);
  377.     while ( dirList.length()) delete (GalleryEntryC *) dirList.remove(1);
  378.  
  379.     return entries;
  380. }
  381.  
  382.  
  383. class GalleryWindowC : public GUIC_WindowC
  384.     {
  385.     public:
  386.         GalleryWindowC    (GUIC_ApplicationC *app, GUIC_ScreenC *screen);
  387.         ~GalleryWindowC (void);
  388.         BOOL action        (GUIC_EventC &);
  389.     private:
  390.         GUIC_ButtonC                *start, *quit;
  391.         GUIC_FileStringC            *pattern;
  392.         GUIC_PathStringC        *directory;
  393.         GUIC_SlidingIntegerC     *lines, *columns;
  394.         GUIC_FrameC                *frame;
  395.         GUIC_CheckboxC        *click;
  396.         GUIC_LabelC                *dirLabel, *pattLabel, *linesLabel, *columnsLabel, *clickLabel;
  397.     };
  398.     
  399. GalleryWindowC::GalleryWindowC    (GUIC_ApplicationC *app, GUIC_ScreenC *screen) : GUIC_WindowC (-1,-1,46,19)
  400. {
  401.     frame                = new GUIC_FrameC                (1,1,44,14,"Gallery");
  402.  
  403.     dirLabel            = new GUIC_LabelC                (3, 2,10,2,"_Directory:");
  404.     pattLabel        = new GUIC_LabelC                (3, 4,10,2,"_Pattern:");
  405.     linesLabel        = new GUIC_LabelC                (3, 7,10,2,"_Lines:");
  406.     columnsLabel    = new GUIC_LabelC                (3, 9,10,2,"_Columns:");
  407.     clickLabel        = new GUIC_LabelC                (3,12,30,2,"Use _thumbnail picture as link:");
  408.  
  409.     directory            = new GUIC_PathStringC        (13, 2,30,2,"");
  410.     pattern            = new GUIC_FileStringC            (13, 4,30,2,"");
  411.     lines                = new GUIC_SlidingIntegerC    (13, 7,30,2,MINLINES,MAXLINES,DEFAULTLINES);
  412.     columns            = new GUIC_SlidingIntegerC    (13, 9,30,2,MINCOLUMNS,MAXCOLUMNS,DEFAULTCOLUMNS);    
  413.     click                = new GUIC_CheckboxC            (40,12, 3,2,FALSE);
  414.     
  415.     start                = new GUIC_ButtonC                (1,16,15,2,"_Start");
  416.     quit                    = new GUIC_ButtonC                (30,16,15,2,"_Quit");
  417.     
  418.     directory    ->setHelp("Directory for the first index file.");
  419.     pattern    ->setHelp("Background pattern in HTML pages.");
  420.     lines        ->setHelp("The number of lines per HTML table.");
  421.     columns    ->setHelp("The number of columns per HTML table.");
  422.     click        ->setHelp("Click on thumbnails to view picture?");
  423.     start        ->setHelp("Start the creation of the gallery.");
  424.     quit            ->setHelp("Quit the program.");
  425.     
  426.     directory    ->setShortcut('d');
  427.     pattern    ->setShortcut('p');
  428.     lines        ->setShortcut('l');
  429.     columns    ->setShortcut('c');
  430.     click        ->setShortcut('t');
  431.     start        ->setShortcut('s');
  432.     quit            ->setShortcut('q');
  433.     
  434.     add(frame);
  435.     add(dirLabel);
  436.     add(directory);
  437.     add(pattLabel);
  438.     add(pattern);
  439.     add(linesLabel);
  440.     add(lines);
  441.     add(columnsLabel);
  442.     add(columns);
  443.     add(clickLabel);
  444.     add(click);
  445.     add(start);
  446.     add(quit);
  447.     
  448.     app->addPrefs("GalleryWindow"            , this);
  449.     app->addPrefs("StartDirectory"            , directory);
  450.     app->addPrefs("BackgroundPattern"    , pattern);
  451.     app->addPrefs("NumberOfLines"            , lines);
  452.     app->addPrefs("PictureAsLink"                , click);
  453.     app->addPrefs("NumberOfColumns"        , columns);
  454.  
  455.     setTitle("Gallery - (c) by Markus Hillenbrand");
  456.     setHelp(TRUE);
  457.     activate();
  458. }
  459. GalleryWindowC::~GalleryWindowC    (void)
  460. {
  461.     delete frame;
  462.     delete dirLabel;
  463.     delete directory;
  464.     delete pattLabel;
  465.     delete pattern;
  466.     delete linesLabel;
  467.     delete lines;
  468.     delete columnsLabel;
  469.     delete columns;
  470.     delete clickLabel;
  471.     delete click;
  472.     delete start;
  473.     delete quit;
  474. }
  475.  
  476. BOOL GalleryWindowC::action(GUIC_EventC &e)
  477. {
  478.     switch (e.id)
  479.         {
  480.         case GUIC_GadgetEvent:
  481.             if (e.gadget == (GUIC_GadgetC *)start)
  482.                 {
  483.                 if (! strcmp(directory->get(), "") )
  484.                     {
  485.                     GUIC_ErrorC e("You must at least enter a directory name!");
  486.                     e.request(this);
  487.                     }
  488.                 else 
  489.                     {
  490.                     GUIC_SystemC::openConsole();
  491.                     sleep();
  492.                     activate();
  493.                     try 
  494.                         {
  495.                         scanDir (directory->get(), pattern->get(), lines->get(), columns->get(), click->get() );
  496.                         }
  497.                     catch (GUIC_Exception &x) { GUIC_ErrorC e("Exception caught:", x.getMessage() ); e.request(this); }
  498.                     waken();
  499.                     }
  500.                 }
  501.             else if (e.gadget == (GUIC_GadgetC *)quit) 
  502.                 {
  503.                 dispose();
  504.                 }
  505.             return TRUE;
  506.             break;
  507.         case GUIC_CloseWindow: 
  508.             return TRUE;
  509.             break;
  510.         default:
  511.             cerr << "Got an event: " << e.id << endl;
  512.         }
  513.     
  514.     return FALSE;
  515. }
  516.  
  517.  
  518.  
  519. void         shell                    (void)
  520. {
  521.     LONG result[] = { 0,0,0,0,0 };
  522.     STRPTR templ = "STARTDIR/A,LINES/N,COLUMNS/N,BGPATTERN,PICCLICK/S";
  523.     GUIC_ProgramArgsC args;
  524.     if (! args.fit(templ, result))
  525.         {
  526.         cerr << "Usage: " << templ << endl;
  527.         GUIC_SystemC::exit(GUIC_ExitError);
  528.         }
  529.     
  530.     LONG lines = result[1] ? *(LONG *)result[1] : DEFAULTLINES;
  531.     if (lines < MINLINES)         lines=MINLINES;
  532.     if (lines > MAXLINES)    lines=MAXLINES;
  533.     
  534.     LONG columns = result[2] ? *(LONG *)result[2] : DEFAULTCOLUMNS;
  535.     if (columns < MINCOLUMNS)     columns=MINCOLUMNS;
  536.     if (columns > MAXCOLUMNS)    columns=MAXCOLUMNS;
  537.     
  538.     BOOL picclick = result[4];
  539.     
  540.     scanDir((STRPTR)result[0], (STRPTR)result[3], lines, columns, picclick); 
  541.  
  542.     if (errorList.length())
  543.         {
  544.         cerr << "The following files could not be converted to a thumbnail:" << endl;
  545.         while (errorList.length())
  546.             {
  547.             GalleryEntryC *s = (GalleryEntryC *)errorList.remove(1);
  548.             cerr << "- " << s->fileName << endl;
  549.             delete s;
  550.             }
  551.         cerr << "Please check them and run 'Gallery' again." << endl;
  552.         }
  553. }
  554. void        workbench            (void)
  555. {
  556.     GUIC_ApplicationC    app("Gallery");
  557.  
  558.     app.setAuthor        (__AUTHOR__);
  559.     app.setVersion    (__VERSION__);
  560.     app.setRevision    (__REVISION__);
  561.     app.setDate        (__DATE__);
  562.     app.setTime        (__TIME__);
  563.     app.setInitializer    (TRUE);
  564.  
  565.     GUIC_ScreenC            screen;
  566.     GalleryWindowC     window(&app, &screen);
  567.     
  568.     screen.add(window);
  569.     app.add(screen);
  570.  
  571.     app.start();
  572.  
  573.     BOOL running = TRUE;
  574.     GUIC_EventC *event = 0;
  575.  
  576.     int count = 0;
  577.     
  578.     while (running && (event = app.wait()) )
  579.         {
  580.         // As we have only one window, it is not neccessary to check for the window id
  581.         if (event->id == GUIC_CloseWindow) 
  582.             {
  583.             GUIC_MessageC    message    ("Do you really want to quit ?", "Yes|No");
  584.             if (1 == message.request(*event->window)) running = FALSE;
  585.             }
  586.         }
  587.  
  588.     app.stop();
  589. }
  590.  
  591. void         main                    (int argc, char **argv)
  592. {
  593.     GUIC_SystemC::checkStackSize(50000);
  594.     if (GUIC_SystemC::runFromShell() ) shell(); else workbench();
  595. }
  596.  
  597.